
// 关键字、define定义常量与宏
// &    *    .    ->这四个见文件2022_11_26.c
#include<stdio.h>

//---------------------------------------------小节分割线--------------------------------------------
// C语言关键字，具体见课件第1节
// 1.C语言提供的，不能自己创建关键字
// 2.变量名不能是关键字
// define、 include都不是关键字，而是预处理指令
// int main()
// {
//     register int num = 100;
//     // register：建议num的值存放在寄存器中，但是是否存放由编译器决定
//     // 计算机中，数据可以存储在那里？
//     // 寄存器 更小
//     // 高速缓存 几十MB
//     // 内存 8G~16G
//     // 硬盘 500G左右
//     // 越往上，造价越高、速度越快、空间越小
//     // CPU中央处理器的处理速度越来越快，但是内存的读写速度不够快，导致CPU速度用不上
//     // 于是CPU直接从寄存器中获取数据，寄存器再从高速缓存获取数据，高速缓存再从内存，再从硬盘
//     // 整体可以使运算速度变快
//     // 大量、频繁使用的数据，就会被编译器放在寄存器中，提升效率
//     return 0;
// }
//---------------------------------------------小节分割线--------------------------------------------
//关键字 typedef：类型重定义
// typedef unsigned int u_int; // 把unsigned int这一段的类型，重新定义为u_int（自己写的）
// int main()
// {
//     unsigned int num1 = 100;
//     u_int num2 = 100; // 以上两种数据类型方式完全一样
//     printf("\n");
//     return 0;
// }
//---------------------------------------------小节分割线--------------------------------------------
// static部分在VScode中有问题，无法观察到效果，在VS2019中可以
//关键字 static：静态的
//1.static修饰局部变量：改变局部变量的生命周期，本质上是改变了变量的存储类型（原本在栈区存储，现在在静态区存储了）
//2.static修饰全局变量：只在本文件中使用。其实不是作用域变小，是因为将全局变量的外部链接属性，鞭尾内部连接属性，其他源文件连接不到了
//3.static修饰函数:函数只能在源文件内部使用，和static修饰全局变量效果类似

// void test()
// {
//     //int a = 1; // 结果是10个2
//     static int a = 1; // 结果是2~11
//     // 因为static修饰的局部变量，在出了局部范围后不会被销毁，生命周期和全局变量一样了
//     a++;
//     printf("%d\n",a);
// }
// int main()
// {
//     int i = 0;
//     while(i < 10)
//     {
//         test();
//         i++;
//     }
//     return 0;
// }
//---------------小分割线 >.< --------------------
// extern int g_val; // 来自文件2022_11_24_2中的全局变量

// int main()
// {
//     printf("%d\n", g_val);
//     return 0;
// }

//---------------小分割线 >.< --------------------
// 来自文件2022_11_24_2中的函数Add
// int main()
// {
//     printf("%d\n", Add(2, 3));
//     return 0;
// }

//---------------------------------------------小节分割线--------------------------------------------
// define 是一个预处理指令
// 1.define定义符号
// #define MAX 1000
// int main()
// {
//     printf("%d\n", MAX);
//     return 0;
// }
//---------------小分割线 >.< --------------------
// 2.define定义宏
// 注意宏的使用是替换，而不是计算结果之后传递
#define ADD(X,Y) X+Y
// #define ADD(X,Y) ((X)+(Y)) // 不会在替换中出现问题的表达方式
int main()
{
    printf("%d\n",ADD(2,3)); // 2+3=5没问题
    printf("%d\n",4*ADD(2,3));// 这里不是先计算2+3=5，再4*5，而是直接替换成4*2+3，所以结果是11
    // 如果将宏的X+Y写成((X)+(Y))才不会出现上述问题
    return 0;
}